import axios from "axios";
import { requestInterceptor, responseInterceptor } from "./authService";

// 创建主axios实例
// 使用10秒超时时间，平衡用户体验和网络稳定性
const instence = axios.create({
  baseURL: import.meta.env.VITE_API_URL,
  timeout: 10000,
  headers: {
    "Content-Type": "application/json",
  },
});

// 添加请求拦截器
// 使用异步拦截器是因为获取令牌可能涉及异步操作（如刷新令牌）
instence.interceptors.request.use(async (config) => {
    // 如果是FormData类型请求，自动删除Content-Type头
    if (config.data instanceof FormData) {
        delete config.headers["Content-Type"];
    }

    // 调用原有的认证拦截器
    return requestInterceptor(config);
});
// 第一个响应拦截器：处理业务逻辑错误
instence.interceptors.response.use(
  (response) => {
    // 1. 处理业务逻辑错误（如401未授权）
    // 为什么在这里检查？因为需要在数据处理前捕获认证错误
    if (response.data && response.data.code === 401) {
      const error = new Error(response.data.msg || '未登录或token已过期');
      (error as any).config = response.config;
      (error as any).response = response; // 传递完整响应对象
      // 添加错误类型标识，便于后续处理
      (error as any).isBusinessError = true;
      throw error;
    }
    // 2. 返回完整响应对象而非仅data字段
    return response;
  },
  // 错误处理：直接传递给下一个拦截器
  (error) => Promise.reject(error)
);

// 第二个响应拦截器：处理令牌刷新和数据提取
// 为什么需要第二个拦截器？分离关注点，保持代码清晰
instence.interceptors.response.use(
  (response) => {
    // 提取data字段作为最终返回值
    // 为什么在这里提取？因为业务代码只需要data部分
    return response.data;
  },
  // 处理错误：包括令牌刷新逻辑
  // 为什么在这里处理？因为刷新令牌是错误恢复机制
  async (error) => responseInterceptor(error)
);

export default instence;